home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
games
/
sakiba
/
source
/
select.c
< prev
next >
Wrap
Text File
|
2000-06-23
|
9KB
|
379 lines
/*************************************************
格闘シミュレーション「さきば」
モード・キャラクタセレクト
*************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <sys\dos.h>
#include <sys\iocs.h>
#include "sakiba.h"
#include "select.h"
#include "screen.h"
#include "pad.h"
#include "sound.h"
/*** キャラクタデータ *******/
extern CHR_DATA chr_roba;
extern CHR_DATA chr_penguin;
extern CHR_DATA chr_jeans;
#define CHR_MAX 3 /* キャラクタ数 */
#define SPRITE_FILE "SELECT" /* スプライトデータ */
#define MODE_X 88 /* ゲームモード描画位置 */
#define MODE_Y 8
#define MODE_H 20
#define CHR_X 64 /* キャラクタ描画位置 */
#define CHR_Y 96
#define CHR_W 24
#define CHR_H 40
/*** スプライトコード *****/
#define SPR_CURSOR1 0x0717 /* カーソル */
#define SPR_CURSOR2 0x4617
#define CODE0 0x40 /* スプライト格納場所 */
#define PALET0 0x08 /* パレット格納場所 */
static
CHR_DATA* chr_data[CHR_MAX] = { /* キャラクタデータ */
&chr_roba,
&chr_penguin,
&chr_jeans
};
static
int chr_pace[CHR_MAX] = { /* キャラクタアニメペース */
8, 16, 12
};
static
char* mode_menu[3] = { " vs COM", /* ゲームモード */
" vs MAN",
"COM vs COM"
};
/**********************
選択初期画面描画
**********************/
static
void start_select(void)
{
int i, x, y;
_iocs_wipe(); /* グラフィッククリア */
y = MODE_Y;
for (i = 0; i < 3; i++) { /* モードメニュー描画 */
draw_str(mode_menu[i], MODE_X, y);
y += MODE_H;
}
x = CHR_X + 40;
y = CHR_Y + 8;
for (i = 0; i < CHR_MAX; i++) { /* キャラクタ名描画 */
draw_str(chr_data[i]->name, x, y);
x += CHR_W;
y += CHR_H;
}
_iocs_contrast(-2); /* フェードイン */
}
/******************************************
キャラクタ描画
引数 f = アニメーションするか
******************************************/
static
void draw_chr(Bool f)
{
CODE code;
int i, x, y, k;
code = CODE0 + PALET0*0x100; /* スプライトコード */
x = CHR_X; /* キャラクタ描画位置 */
y = CHR_Y;
for (i = 0; i < CHR_MAX; i++) {
if ( f ) {
k = (anim_count/chr_pace[i]) % 4; /* アニメーション */
k = (k == 3) ? 2 : ((k == 2) ? 0 : k);
}
else {
k = 0;
}
put_sprite(code + k, x + 16, y + 16); /* スプライト描画 */
put_sprite(code + k + 0x10, x + 16, y + 32);
code += 0x103;
x += CHR_W;
y += CHR_H;
}
}
/*******************************************
モード選択画面描画
引数 sel1, sel2 = セレクト番号
*******************************************/
static
void draw_sel_mode(int sel1, int sel2)
{
int ssp;
ssp = _iocs_b_super(0); /* スーパーバイザモード */
sprite_reg = SPRITE_REG; /* スプライトレジスタ先頭 */
v_synch(); /* 垂直同期 */
put_sprite(SPR_CURSOR1 + ((anim_count/8) % 3), /* 1Pカーソル描画 */
MODE_X, MODE_Y + 16 + MODE_H*sel1);
put_sprite(SPR_CURSOR2 + ((anim_count/8) % 3), /* 2Pカーソル描画 */
MODE_X + 96, MODE_Y + 16 + MODE_H*sel2);
draw_chr(FALSE); /* キャラクタ描画 */
while ( (unsigned long)sprite_reg < (unsigned long)(SPRITE_REG + 4*0x100) ) {
sprite_reg += 3;
*sprite_reg++ = 0; /* スプライト非表示 */
}
_iocs_b_super(ssp); /* ユーザーモード */
}
/************************************
モード選択
引数 opr = 操作バッファ
戻り値 プレイヤー
************************************/
static
int select_mode(int opr[2])
{
static int sel[2] = {0, 0};
PAD pad;
int i, player;
player = -1;
while ( player < 0 ) {
draw_sel_mode(sel[PLAYER1], sel[PLAYER2]); /* 画面描画 */
if ( esc_key ) {
return -1; /* ゲーム終了 */
}
for (i = 0; i < 2; i++) {
pad = get_rept(i); /* パッド入力 */
if ( pad & PAD_A ) { /* 決定 */
player = i;
}
else if ( (pad & PAD_UP) && (sel[i] > 0) ) {
sel[i]--;
}
else if ( (pad & PAD_DOWN) && (sel[i] < 2) ) {
sel[i]++;
}
}
}
switch ( sel[player] ) {
case 0 : /* MAN vs COM */
opr[PLAYER1] = (player == PLAYER1) ? OPR_PLAYER : OPR_COM;
opr[PLAYER2] = (player == PLAYER2) ? OPR_PLAYER : OPR_COM;
break;
case 1 : /* MAN vs MAN */
opr[PLAYER1] = OPR_PLAYER;
opr[PLAYER2] = OPR_PLAYER;
break;
case 2 : /* COM vs COM */
opr[PLAYER1] = OPR_COM;
opr[PLAYER2] = OPR_COM;
break;
default :
break;
}
return player;
}
/*******************************************
キャラクタ選択画面描画
引数 sel1, sel2 = セレクト番号
*******************************************/
static
void draw_sel_chr(int sel1, int sel2)
{
int ssp;
ssp = _iocs_b_super(0); /* スーパーバイザモード */
sprite_reg = SPRITE_REG; /* スプライトレジスタ先頭 */
v_synch(); /* 垂直同期 */
if ( sel1 >= 0 ) { /* 1P */
draw_message(MES_1P, CHR_X - 10 + CHR_W*sel1, CHR_Y + 6 + CHR_H*sel1);
}
if ( sel2 >= 0 ) { /* 2P */
draw_message(MES_2P, CHR_X + 28 + CHR_W*sel2, CHR_Y + 14 + CHR_H*sel2);
}
draw_chr(TRUE); /* キャラクタ描画 */
while ( (unsigned long)sprite_reg < (unsigned long)(SPRITE_REG + 4*0x100) ) {
sprite_reg += 3;
*sprite_reg++ = 0; /* スプライト非表示 */
}
_iocs_b_super(ssp); /* ユーザーモード */
}
/************************************************
キャラクタ選択
引数 chr = キャラクタデータバッファ
num = 入力対象
t = 入力人数
f = フェードアウトするか
戻り値 0 : 決定
1 : キャンセル
-1 : ゲーム終了
************************************************/
int select_chr(CHR_DATA* chr[2], int num[2], int t, Bool f)
{
static int sel[2] = {0, 0};
PAD pad;
int i, cnt;
cnt = 150;
while ( cnt > 0 ) {
draw_sel_chr((((num[0] == 0) || (num[1] == 0)) && (anim_count % 2))
? - 1 : sel[PLAYER1],
(((num[0] == 1) || (num[1] == 1)) && !(anim_count % 2))
? - 1 : sel[PLAYER2]);
/* 画面描画 */
if ( esc_key ) {
return -1; /* ゲーム終了 */
}
for (i = 0; i < 2; i++) {
pad = get_rept(i);
if ( pad & PAD_B ) { /* キャンセル */
return 1;
}
if ( num[i] >= 0 ) {
if ( pad & PAD_A ) { /* 決定 */
chr[num[i]] = chr_data[sel[num[i]]];
num[i] = -1;
t--;
}
else if ( (pad & PAD_UP) && (sel[num[i]] > 0) ) {
sel[num[i]]--;
}
else if ( (pad & PAD_DOWN) && (sel[num[i]] < 2) ) {
sel[num[i]]++;
}
}
}
if ( t == 0 ) {
if ( f ) { /* フェードアウト */
if ( cnt == 150 ) {
_iocs_contrast(0); /* 画面フェードアウト */
fadeout_music(); /* BGMフェードアウト */
}
cnt--;
}
else {
cnt = 0;
}
}
}
return 0;
}
/************************************************
モード・キャラクタ選択
引数 chr = キャラクタデータバッファ
opr = 操作バッファ
戻り値 TRUE : ゲーム続行
FALSE : 終了
************************************************/
Bool select(CHR_DATA* chr[2], int opr[2])
{
int player, num[2];
Bool loop, loop2;
if ( load_sprite(SPRITE_FILE, SPRITE_FILE, CODE0, PALET0) ) {
/* スプライト読み込み */
return FALSE;
}
play_select_bgm(); /* BGM演奏開始 */
start_select(); /* 初期画面描画 */
loop = TRUE;
while ( loop ) {
if ( (player = select_mode(opr)) < 0 ) { /* モード選択 */
return FALSE;
}
if ( (opr[PLAYER1] == OPR_PLAYER) && (opr[PLAYER2] == OPR_PLAYER) ) {
/* 対戦 */
num[PLAYER1] = PLAYER1;
num[PLAYER2] = PLAYER2;
switch ( select_chr(chr, num, 2, TRUE) ) {
case 0 : /* 決定 */
loop = FALSE;
break;
case 1 : /* キャンセル */
break;
default : /* ゲーム終了 */
return FALSE;
}
}
else {
num[player ^ 0x01] = -1;
loop2 = TRUE;
while ( loop2 ) {
num[player] = player;
switch ( select_chr(chr, num, 1, FALSE) ) {
case 0 :
num[player] = player ^ 0x01;
switch ( select_chr(chr, num, 1, TRUE) ) {
case 0 :
loop = FALSE;
loop2 = FALSE;
break;
case 1 :
break;
default :
return FALSE;
}
break;
case 1 :
loop2 = FALSE;
break;
default :
return FALSE;
}
}
}
}
return TRUE;
}
/************************************************
自動選択
引数 chr = キャラクタデータバッファ
opr = 操作バッファ
************************************************/
void auto_select(CHR_DATA* chr[2], int opr[2])
{
chr[PLAYER1] = chr_data[rnd(CHR_MAX)]; /* キャラクタ */
chr[PLAYER2] = chr_data[rnd(CHR_MAX)];
opr[PLAYER1] = OPR_COM; /* コンピュータ操作 */
opr[PLAYER2] = OPR_COM;
}
/********************** End of File *******************************************/